package com.kty.utils;

import com.kty.entity.SixtyFourTrigram;
import com.kty.controller.MHYSController;

/**
 * 根据 （'本卦' + 动爻数）判断 → 变卦
 * <p>
 * <p>
 * 图形      八卦（先天顺序）
 * <p>
 * "☰"      乾卦（1）
 * "☱"      兑卦（2）
 * "☲"      离卦（3）
 * "☳"      震卦（4）
 * "☴"      巽卦（5）
 * "☵"      坎卦（6）
 * "☶"      艮卦（7）
 * "☷"      坤卦（8）
 */
public class BianGua {

    private static final SixtyFourTrigram sft = new SixtyFourTrigram();

    private static final String[] lssg = sft.getLssg(); // 获取 六十四卦 字符数组

//======================================================================================================================


    /**
     * 动爻为（1\2\3）时 → 上卦不变，下卦变
     */
    public static String up() {

        // 获取 上卦的'上卦数'
        int oldShangGua = MHYSController.getUpperHexagramNumber();

        // 获取 下卦的'下卦数'
        int oldXiaGua = MHYSController.getDivinationNumber();

        // 临时存放变化后的 '下卦'
        int newXiaGua = 0;

        // 判断 '动爻数'
        switch (MHYSController.move()) {
            case 1:
                newXiaGua = oneDongYao(oldXiaGua, newXiaGua); // 动爻数为 1
                break;
            case 2:
                newXiaGua = twoDongYao(oldXiaGua, newXiaGua); // 动爻数为 2
                break;
            case 3:
                newXiaGua = threeDongYao(oldXiaGua, newXiaGua); // 动爻数为 3
        }

        // 根据 （原上卦 + 新下卦）判断 '变卦'
        return BenGua.TuXing(oldShangGua, newXiaGua);

    }

//--------------------------------------------------------------------------

    /**
     * 动爻数为 1 → 上卦不变，下卦变
     *
     * @param oldXiaGua
     * @param newXiaGua
     * @return
     */
    private static int oneDongYao(int oldXiaGua, int newXiaGua) {

        return getOneOrFour(newXiaGua, oldXiaGua);

    }


    /**
     * 动爻数为 2 → 上卦不变，下卦变
     *
     * @param oldXiaGua
     * @param newXiaGua
     * @return
     */
    private static int twoDongYao(int oldXiaGua, int newXiaGua) {

        return getTwoOrFive(newXiaGua, oldXiaGua);

    }


    /**
     * 动爻数为 3 → 上卦不变，下卦变
     *
     * @param oldXiaGua
     * @param newXiaGua
     * @return
     */
    private static int threeDongYao(int oldXiaGua, int newXiaGua) {

        return getThreeOrSix(oldXiaGua, newXiaGua);

    }


//**********************************************************************************************************************


    /**
     * 动爻为（4\5\6）时 → 上卦变，下卦不变
     */
    public static String down() {

        // 获取 上卦的'上卦数'
        int oldShangGua = MHYSController.getUpperHexagramNumber();

        // 获取 下卦的'下卦数'
        int oldXiaGua = MHYSController.getDivinationNumber();

        // 临时存放变化后的 '上卦'
        int newShangGua = 0;

        // 判断 原上卦数
        // 判断 '动爻数'
        switch (MHYSController.move()) {
            case 4:
                newShangGua = fourDongYao(newShangGua, oldShangGua); // 动爻数为 4
                break;
            case 5:
                newShangGua = fiveDongYao(newShangGua, oldShangGua); // 动爻数为 5
                break;
            case 6:
                newShangGua = sixDongYao(newShangGua, oldShangGua); // 动爻数为 6
        }

        // 根据 （新上卦 + 原下卦）判断 '变卦'
        return BenGua.TuXing(newShangGua, oldXiaGua);

    }

//--------------------------------------------------------------------------

    /**
     * 动爻数为 4 → 上卦变，下卦不变
     *
     * @param oldshanggua
     * @param newShangGua
     * @return
     */
    private static int fourDongYao(int newShangGua, int oldshanggua) {

        return getOneOrFour(newShangGua, oldshanggua);

    }


    /**
     * 动爻数为 5 → 上卦变，下卦不变
     *
     * @param oldshanggua
     * @param newShangGua
     * @return
     */
    private static int fiveDongYao(int newShangGua, int oldshanggua) {

        return getTwoOrFive(newShangGua, oldshanggua);

    }

    /**
     * 动爻数为 6 → 上卦变，下卦不变
     *
     * @param oldShangGua
     * @param newShangGua
     * @return
     */
    private static int sixDongYao(int newShangGua, int oldShangGua) {

        return getThreeOrSix(newShangGua, oldShangGua);

    }


//**********************************************************************************************************************


    /**
     * 动爻数为（ 1 或 4 ）
     *
     * @param newGuaShu
     * @param oldGuaShu
     * @return
     */
    private static int getOneOrFour(int newGuaShu, int oldGuaShu) {

        // 判断卦数
        switch (oldGuaShu) {
            case 1:
                newGuaShu = 5; // '乾' 变 '巽' → （'1' 变 '5'）（'☰' 变 '☴'）
                break;
            case 2:
                newGuaShu = 6; // '兑' 变 '坎' → （'2' 变 '6'）（'☱' 变 '☵'）
                break;
            case 3:
                newGuaShu = 7; // '离' 变 '艮' → （'3' 变 '7'）（'☲' 变 '☶'）
                break;
            case 4:
                newGuaShu = 8; // '震' 变 '坤' → （'4' 变 '8'）（'☳' 变 '☷'）
                break;
            case 5:
                newGuaShu = 1; // '巽' 变 '乾' → （'5' 变 '1'）（'☴' 变 '☰'）
                break;
            case 6:
                newGuaShu = 2; // '坎' 变 '兑' → （'6' 变 '2'）（'☵' 变 '☱'）
                break;
            case 7:
                newGuaShu = 3; // '艮' 变 '离' → （'7' 变 '3'）（'☶' 变 '☲'）
                break;
            case 8:
                newGuaShu = 4; // '坤' 变 '震' → （'8' 变 '4'）（'☷' 变 '☳'）
        }
        return newGuaShu;
    }

    /**
     * 动爻数为（ 2 或 5 ）
     *
     * @param oldGuaShu
     * @param newGuaShu
     * @return
     */
    private static int getTwoOrFive(int newGuaShu, int oldGuaShu) {

        // 判断卦数
        switch (oldGuaShu) {
            case 1:
                newGuaShu = 3; // '乾' 变 '离' → （'1' 变 '3'）（'☰' 变 '☲'）
                break;
            case 2:
                newGuaShu = 4; // '兑' 变 '震' → （'2' 变 '4'）（'☱' 变 '☳'）
                break;
            case 3:
                newGuaShu = 1; // '离' 变 '乾' → （'3' 变 '1'）（'☲' 变 '☰'）
                break;
            case 4:
                newGuaShu = 2; // '震' 变 '兑' → （'4' 变 '2'）（'☳' 变 '☱'）
                break;
            case 5:
                newGuaShu = 7; // '巽' 变 '艮' → （'5' 变 '7'）（'☴' 变 '☶'）
                break;
            case 6:
                newGuaShu = 8; // '坎' 变 '坤' → （'6' 变 '8'）（'☵' 变 '☷'）
                break;
            case 7:
                newGuaShu = 5; // '艮' 变 '巽' → （'7' 变 '5'）（'☶' 变 '☴'）
                break;
            case 8:
                newGuaShu = 6; // '坤' 变 '坎' → （'8' 变 '6'）（'☷' 变 '☵'）
        }
        return newGuaShu;

    }

    /**
     * 动爻数为（ 3 或 6 ）
     *
     * @param oldGuaShu
     * @param newGuaShu
     * @return
     */
    private static int getThreeOrSix(int oldGuaShu, int newGuaShu) {

        // 判断卦数
        switch (oldGuaShu) {
            case 1:
                newGuaShu = 2; // '乾' 变 '兑' → （'1' 变 '2'）（'☰' 变 '☱'）
                break;
            case 2:
                newGuaShu = 1; // '兑' 变 '乾' → （'2' 变 '1'）（'☱' 变 '☰'）
                break;
            case 3:
                newGuaShu = 4; // '离' 变 '震' → （'3' 变 '4'）（'☲' 变 '☳"'）
                break;
            case 4:
                newGuaShu = 3; // '震' 变 '离' → （'4' 变 '3'）（'☳"' 变 '☲'）
                break;
            case 5:
                newGuaShu = 6; // '巽' 变 '坎' → （'5' 变 '6'）（'☴' 变 '☵'）
                break;
            case 6:
                newGuaShu = 5; // '坎' 变 '巽' → （'6' 变 '5'）（'☵' 变 '☴'）
                break;
            case 7:
                newGuaShu = 8; // '艮' 变 '坤' → （'7' 变 '8'）（'☶' 变 '☷'）
                break;
            case 8:
                newGuaShu = 7; // '坤' 变 '艮' → （'8' 变 '7'）（'☷' 变 '☶'）
                break;
        }
        return newGuaShu;

    }


//**********************************************************************************************************************


    /**
     * 判断动爻数，判断并返回对应的 '变卦图形'
     */
    public static String bianGuaTu() {

        String benGuaTu = null; // 记录 '本卦图形'

        // 判断动爻数 → 动爻为（1\2\3）时 '上卦' 不变  动爻为（4\5\6）时 '下卦' 不变
        switch (MHYSController.move()) {
            case 1:
            case 2:
            case 3:
                benGuaTu = up();
                break;
            case 4:
            case 5:
            case 6:
                benGuaTu = down();
                break;
        }
        return benGuaTu;
    }


    /**
     * 根据 变卦图形 返回对应的 变卦索引值
     */
    public static int bianGuaIndex() {

        String bgt = bianGuaTu(); // 本卦图形

        return BenGua.getIndex(bgt); // 本卦索引值

    }


    /**
     * 根据 变卦图形的索引值 返回对应的 变卦信息
     */
    public static String bianGua() {

        int index = bianGuaIndex(); // 索引值

        // 返回对应 本卦信息
        return lssg[index];

    }


}
